

<!DOCTYPE HTML>
<html>
<head>
  <meta charset="utf-8">
  
  <title>第 2 页 | k1988</title>
  <meta name="author" content="赵海洋">
  
  <meta name="description" content="个人博客">
  
  
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  
  <meta property="og:site_name" content="k1988"/>

  
    <meta property="og:image" content="undefined"/>
  

  <link href="/favicon.ico" rel="icon" type="image/x-ico">
  <link rel="alternate" href="http://k1988.github.com/rss.xml" title="k1988" type="application/rss+xml">
  <link rel="stylesheet" href="/css/style.css" media="screen" type="text/css">
  <!--[if lt IE 9]><script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
  <script src="//libs.baidu.com/jquery/1.8.0/jquery.min.js"></script>
</head>


<body>
  <header id="header" class="inner">
<div class="alignleft">
  <h1><a href="/">k1988</a></h1>
  <h2><a href="/"></a></h2>
</div>
<nav id="main-nav" class="alignright">
  <ul>
    
      <li><a href="/">首页</a></li>
    
      <li><a href="/archives">归档</a></li>
    
      <li><a href="/about">关于</a></li>
    
	<li> <a href="/rss.xml">RSS</a> </li>
<li> <a title="把这个链接拖到你的Chrome收藏夹工具栏中" href='javascript:(function() {
	function c() {
		var e = document.createElement("link");
		e.setAttribute("type", "text/css");
		e.setAttribute("rel", "stylesheet");
		e.setAttribute("href", f);
		e.setAttribute("class", l);
		document.body.appendChild(e)
	}
 
	function h() {
		var e = document.getElementsByClassName(l);
		for (var t = 0; t < e.length; t++) {
			document.body.removeChild(e[t])
		}
	}
 
	function p() {
		var e = document.createElement("div");
		e.setAttribute("class", a);
		document.body.appendChild(e);
		setTimeout(function() {
			document.body.removeChild(e)
		}, 100)
	}
 
	function d(e) {
		return {
			height : e.offsetHeight,
			width : e.offsetWidth
		}
	}
 
	function v(i) {
		var s = d(i);
		return s.height > e && s.height < n && s.width > t && s.width < r
	}
 
	function m(e) {
		var t = e;
		var n = 0;
		while (!!t) {
			n += t.offsetTop;
			t = t.offsetParent
		}
		return n
	}
 
	function g() {
		var e = document.documentElement;
		if (!!window.innerWidth) {
			return window.innerHeight
		} else if (e && !isNaN(e.clientHeight)) {
			return e.clientHeight
		}
		return 0
	}
 
	function y() {
		if (window.pageYOffset) {
			return window.pageYOffset
		}
		return Math.max(document.documentElement.scrollTop, document.body.scrollTop)
	}
 
	function E(e) {
		var t = m(e);
		return t >= w && t <= b + w
	}
 
	function S() {
		var e = document.createElement("audio");
		e.setAttribute("class", l);
		e.src = i;
		e.loop = false;
		e.addEventListener("canplay", function() {
			setTimeout(function() {
				x(k)
			}, 500);
			setTimeout(function() {
				N();
				p();
				for (var e = 0; e < O.length; e++) {
					T(O[e])
				}
			}, 15500)
		}, true);
		e.addEventListener("ended", function() {
			N();
			h()
		}, true);
		e.innerHTML = " <p>If you are reading this, it is because your browser does not support the audio element. We recommend that you get a new browser.</p> <p>";
		document.body.appendChild(e);
		e.play()
	}
 
	function x(e) {
		e.className += " " + s + " " + o
	}
 
	function T(e) {
		e.className += " " + s + " " + u[Math.floor(Math.random() * u.length)]
	}
 
	function N() {
		var e = document.getElementsByClassName(s);
		var t = new RegExp("\\b" + s + "\\b");
		for (var n = 0; n < e.length; ) {
			e[n].className = e[n].className.replace(t, "")
		}
	}
 
	var e = 30;
	var t = 30;
	var n = 350;
	var r = 350;
	var i = "//s3.amazonaws.com/moovweb-marketing/playground/harlem-shake.mp3";
	var s = "mw-harlem_shake_me";
	var o = "im_first";
	var u = ["im_drunk", "im_baked", "im_trippin", "im_blown"];
	var a = "mw-strobe_light";
	var f = "//s3.amazonaws.com/moovweb-marketing/playground/harlem-shake-style.css";
	var l = "mw_added_css";
	var b = g();
	var w = y();
	var C = document.getElementsByTagName("*");
	var k = null;
	for (var L = 0; L < C.length; L++) {
		var A = C[L];
		if (v(A)) {
			if (E(A)) {
				k = A;
				break
			}
		}
	}
	if (A === null) {
		console.warn("Could not find a node of the right size. Please try a different page.");
		return
	}
	c();
	S();
	var O = [];
	for (var L = 0; L < C.length; L++) {
		var A = C[L];
		if (v(A)) {
			O.push(A)
		}
	}
})()    '>High一下</a> </li>

  </ul>
  <div class="clearfix"></div>
</nav>
<div class="clearfix"></div></header>
  <div id="content" class="inner">
    <div id="main-col" class="alignleft"><div id="wrapper">
  <article class="post">
  
    <div class="gallery">
  <div class="photoset">
    
      <img src="">
    
  </div>
  <div class="control">
    <div class="prev"></div>
    <div class="next"></div>
  </div>
</div>
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
        <time datetime="2016-09-22T05:58:28.000Z"><a href="/2016/09/104_IE控件在flash跨域时回调接口无效/">2016-09-22</a></time>
      
      
  
    <h1 class="title"><a href="/2016/09/104_IE控件在flash跨域时回调接口无效/">IE控件在flash跨域时回调接口无效的问题研究</a></h1>
  

    </header>
    <div class="entry">
      
        <p>问题是这样的，我们公司的产品《UU页游戏助手》中是使用了IE浏览器的ActiveX控件来运行网页游戏，其中创建代码是这样的：<br>
      
    </div>
    <footer>
      
        
          <div class="alignleft">
            <a href="/2016/09/104_IE控件在flash跨域时回调接口无效/#more" class="more-link">阅读全文</a>
          </div>
        
        
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>




  <article class="post">
  
    <div class="gallery">
  <div class="photoset">
    
      <img src="">
    
  </div>
  <div class="control">
    <div class="prev"></div>
    <div class="next"></div>
  </div>
</div>
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
        <time datetime="2016-08-18T03:44:28.000Z"><a href="/2016/08/103_java Annotation(注解)/">2016-08-18</a></time>
      
      
  
    <h1 class="title"><a href="/2016/08/103_java Annotation(注解)/">Java Annotation(Java注解)</a></h1>
  

    </header>
    <div class="entry">
      
        <h2 id="Java注解的基础知识点"><a href="#Java注解的基础知识点" class="headerlink" title="Java注解的基础知识点"></a>Java注解的基础知识点</h2><!--![123](./images/annotation.jpg)-->
<img title="Java注解的基础知识点" alt="Java注解的基础知识点" src="http://o9tn2674s.bkt.clouddn.com/static/images/annotation.jpg-k1988"> 
<h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ul>
<li><a href="http://swiftlet.net/archives/1906" target="_blank" rel="external">注解系列知识总结</a></li>
<li><a href="http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html" target="_blank" rel="external">深入理解Java：注解（Annotation）自定义注解入门</a></li>
<li><a href="http://blog.csdn.net/duo2005duo/article/details/50505884" target="_blank" rel="external">Java注解（1）-基础</a></li>
<li><a href="http://blog.csdn.net/duo2005duo/article/details/50511476" target="_blank" rel="external">Java注解（2）-运行时框架</a></li>
<li><a href="http://blog.csdn.net/duo2005duo/article/details/50541281" target="_blank" rel="external"> Java注解（3）-源码级框架</a></li>
<li><a href="http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html" target="_blank" rel="external">深入理解Java：注解（Annotation）自定义注解入门</a></li>
<li><a href="深入理解Java：注解（Annotation）--注解处理器">深入理解Java：注解（Annotation）–注解处理器</a></li>
</ul>

      
    </div>
    <footer>
      
        
        
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>




  <article class="post">
  
    <div class="gallery">
  <div class="photoset">
    
      <img src="">
    
  </div>
  <div class="control">
    <div class="prev"></div>
    <div class="next"></div>
  </div>
</div>
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
        <time datetime="2016-08-12T02:44:28.000Z"><a href="/2016/08/102/">2016-08-12</a></time>
      
      
  
    <h1 class="title"><a href="/2016/08/102/">minecraft联机知识点</a></h1>
  

    </header>
    <div class="entry">
      
        <h1 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h1><p>%mc%.minecraft\servers.dat里存放着所有的服务器地址、名称、图标、介绍等信息。其中服务器地址和名称可以通过mc的主菜单-&gt;多人游戏-&gt;添加服务器进行添加。</p>
<h1 id="命令行"><a href="#命令行" class="headerlink" title="命令行"></a>命令行</h1><p>也可以通过命令行 –server mc.ymdcyy.com –port 25565 来启动mc，使之直接连接到服务器。</p>
<h1 id="架设服务器"><a href="#架设服务器" class="headerlink" title="架设服务器"></a>架设服务器</h1><p>通过
      
    </div>
    <footer>
      
        
          <div class="alignleft">
            <a href="/2016/08/102/#more" class="more-link">阅读全文</a>
          </div>
        
        
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>




  <article class="post">
  
    <div class="gallery">
  <div class="photoset">
    
      <img src="">
    
  </div>
  <div class="control">
    <div class="prev"></div>
    <div class="next"></div>
  </div>
</div>
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
        <time datetime="2016-08-10T10:29:28.000Z"><a href="/2016/08/fontconfig.properties/">2016-08-10</a></time>
      
      
  
    <h1 class="title"><a href="/2016/08/fontconfig.properties/">通过修改fontconfig.properties文件来改变IDE字体</a></h1>
  

    </header>
    <div class="entry">
      
        <p>在公司的win10上使用IDEA,设置字体为Monospaced和18号字体，发现中文显示出来不对。明明输入 的是“中文”结果显示出来的是“争X”(这个x是个奇怪的字我打不出来)，复制到别的ide里也是“中文”。
      
    </div>
    <footer>
      
        
          <div class="alignleft">
            <a href="/2016/08/fontconfig.properties/#more" class="more-link">阅读全文</a>
          </div>
        
        
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>




  <article class="post">
  
    <div class="gallery">
  <div class="photoset">
    
      <img src="">
    
  </div>
  <div class="control">
    <div class="prev"></div>
    <div class="next"></div>
  </div>
</div>
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
        <time datetime="2016-07-17T07:49:48.000Z"><a href="/2016/07/libtorrent打洞分析/">2016-07-17</a></time>
      
      
  
    <h1 class="title"><a href="/2016/07/libtorrent打洞分析/">libtorrent打洞分析</a></h1>
  

    </header>
    <div class="entry">
      
        <h1 id="相关变量"><a href="#相关变量" class="headerlink" title="相关变量"></a>相关变量</h1><ul>
<li><code>torrent_peer::supports_holepunch</code>：torrent_peer类是每个peer的特征集合，其中<code>supports_holepunch</code>代表是否支持打洞，默认值是<code>false</code>。</li>
<li><code>bt_peer_connection::m_holepunch_id</code>: 对方peer申明的，它所支持的打洞消息的消息id。</li>
</ul>
<h1 id="种子来源"><a href="#种子来源" class="headerlink" title="种子来源"></a>种子来源</h1><p>添加peer的流程：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">torrent::add_peer</span><br><span class="line">---&gt;</span><br><span class="line">peer_list::add_i2p_peer或peer_list::add_peer </span><br><span class="line">---&gt;</span><br><span class="line">peer_list::insert_peer或peer_list::update_peer</span><br><span class="line"></span><br><span class="line">```    </span><br><span class="line"></span><br><span class="line">如果flags参数包含`flag_holepunch`时，才设置`torrent_peer::supports_holepunch`为true。&lt;!--more--&gt;查找所有调用add_peer的地方，约有以下来源：</span><br><span class="line"></span><br><span class="line">* 从resume文件里获得peer(上次开启任务保存的)</span><br><span class="line">* dht方式从互联网中得到种子</span><br><span class="line">* tracker从互联网中拿到种子</span><br><span class="line">* lsd方式从本地网络得到种子</span><br><span class="line">* pex方式从互联网中拿到种子</span><br><span class="line"></span><br><span class="line">其中只有从pex方式得到互联网种子的调用语句使用flags参数，</span><br><span class="line"></span><br><span class="line"># 判断是否支持打洞消息</span><br><span class="line">在和另一个peer建立连接时，使用bt_peer_connection类，q原来成员变量bt_peer_connection::m_supports_extensions默认值为false，表示不支持bt扩展协议。</span><br><span class="line"></span><br><span class="line">在bt_peer_connection的握手时，会发送是否支持扩展协议的标志，以及支持哪些扩展。</span><br><span class="line">当确定对面也支持扩展时，进行扩展的handshake操作，其中发送出去的becode结构中，有几以下个整形变量upload_only、ut_holepunch、lt_donthave，他们就对应着本peer接收这3种通知时使用的消息id类型。</span><br><span class="line"></span><br><span class="line">当从握手拿到了对方设置的ut_holepunch时，赋值给成员变量m_holepunch_id,此时此连接的函数supports_holepunch就返回了true值，表示支持打洞。</span><br></pre></td></tr></table></figure></p>
<p>bool bt_peer_connection::supports_holepunch() const { return m_holepunch_id != 0; }<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">但bt_peer_connection的supports_holepunch()返回true只能说明此peer支持打洞，打洞是需要第三方服务器介入的，如何得到中间介绍人呢，见下节。</span><br><span class="line"></span><br><span class="line"># 中间介绍人</span><br><span class="line">上文提到，种子来源有pex方式。</span><br><span class="line"></span><br><span class="line">当session开启了ut_pex插件时(`session_handle::add_extension(&amp;libtorrent::create_ut_pex_plugin)`)，在ut_pex_peer_plugin::tick()中会使用send_ut_peer_list和send_ut_peer_diff函数来向其它peer发送自己拥有的种子。其中`bt_peer_connection* p = static_cast&lt;bt_peer_connection*&gt;(peer); ... flags |= p-&gt;supports_holepunch() ? 8 : 0;`将peer信息发送给另外一个peer时，会带上了支持打洞的flags，然后接收方拿到peer后，向torrent里添加peer时，`torrent_peer::supports_holepunch`的值就会是true了。</span><br><span class="line"></span><br><span class="line">假设自己是peer A，和peer B握手后知道B是支持打洞消息的，在和peer C连接时，使用pex扩展协议和peer C交换peer时，会把peer B的ip、端口、标志传递peer C，peer C拿到B后就满足了打洞的条件，因为A和B能正常通信，A和C也能正常通信，B和C就可以使用中间人A来进行打洞。</span><br><span class="line"></span><br><span class="line"># 什么时候尝试打洞</span><br><span class="line">在连接某个peer失败时，并且满足条件时，尝试进入打洞模式。见`void peer_connection::connect_failed(error_code const&amp; e)`中，</span><br></pre></td></tr></table></figure></p>
<p>if ((!is_utp(<em>m_socket)<br>        || !m_settings.get_bool(settings_pack::enable_outgoing_tcp))<br>    &amp;&amp; m_peer_info<br>    &amp;&amp; m_peer_info-&gt;supports_holepunch<br>    &amp;&amp; !m_holepunch_mode)<br>{<br>    // see if we can try a holepunch<br>    bt_peer_connection</em> p = t-&gt;find_introducer(remote());<br>    if (p)<br>        p-&gt;write_holepunch_msg(bt_peer_connection::hp_rendezvous, remote(), 0);<br>}<br>```<br>假设这段代码是peer C的机器上运行，也就是C从A拿到B的信息后，直接连接B失败了，就判断现在不是utp或者禁止tcp连接、并且支持打洞消息、当前不是打洞模式并且找到了中间介绍人(上文中提到的A)，则向A发送消息开启打洞流程。</p>
<p>参数中<code>bt_peer_connection::hp_rendezvous</code>这个变量很有意思，rendezvous是约会地点的意思，当然在这里只是一个消息类型，remote()是B的ip地址信息。</p>
<p>A接收到C发送的请求打洞（介绍约会）消息后，在自己的peer里找到和B的连接，并且向B发送个打洞消息<code>p-&gt;write_holepunch_msg(hp_connect, remote(), 0);</code>，同时向C也回复一个打洞消息<code>write_holepunch_msg(hp_connect, ep, 0);</code>，这里就将自己和B、C的连接时使用的ip地址和端口通知给C、B。</p>
<p>B和C接收到类型为hp_connect的消息后，将torrent_peer::supports_utp置为true，将bt_peer_connection的m_holepunch_mode设置为true。然后同时开始尝试连接对方，这时，就完成了一个打洞流程，但是由于NAT的特性，不一定成功，具体参考NAT和打洞原理。</p>
<h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><ol>
<li>A从trcker拿到peer B和peer C，和B和C进行连接时，知道了B和C支持打洞消息。</li>
<li>A和C进行pex种子交换，将B传递给C，此时B由pex传递的flags知道C能够通过A打洞。</li>
<li>B如果连接C正常(不需要打洞)则正常连接。</li>
<li>B如果连接C失败，就尝试通过A打洞。于是向A发送了打洞请求。</li>
<li>A接收到B要向C连接的打洞请求，就给B和C发送了互相连接的打洞消息。</li>
<li>B和C接收请求后，相互发送消息，可能会打通NAT。</li>
</ol>

      
    </div>
    <footer>
      
        
        
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>




  <article class="post">
  
    <div class="gallery">
  <div class="photoset">
    
      <img src="">
    
  </div>
  <div class="control">
    <div class="prev"></div>
    <div class="next"></div>
  </div>
</div>
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
        <time datetime="2016-02-03T00:28:11.000Z"><a href="/2016/02/101/">2016-02-03</a></time>
      
      
  
    <h1 class="title"><a href="/2016/02/101/">使用SHA1、SHA2双证书进行微软签名</a></h1>
  

    </header>
    <div class="entry">
      
        <p>微软是第一个宣布了SHA-1弃用计划，在2016年之后Windows和IE将不再信任SHA-1证书。正好我们公司的数字签名也到期了，索性就重新申请了sha256和sha1的新数字证书，用来给产品签名。</p>
<p>这时就要把用了多年的自动签名脚本改为支持sha256和sha1双证书的格式。公司原使用signcode.exe和SignTool.exe两种方式进行签名，其中signcode配合另外找的signcode-pwd.exe工具和pvk+spc文件可以不需要密码即可实现签名(不在此文中详诉)，SignTool是直接用pfx证书+密码来进行签名。于是分别寻找两种方式：<br>
      
    </div>
    <footer>
      
        
          <div class="alignleft">
            <a href="/2016/02/101/#more" class="more-link">阅读全文</a>
          </div>
        
        
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>





<nav id="pagination">
  
    <a href="/" class="alignleft prev">上一页</a>
  
  
    <a href="/page/3/" class="alignright next">下一页</a>
  
  <div class="clearfix"></div>
</nav></div></div>
    <aside id="sidebar" class="alignright">
  <div class="search">
  <form action="//google.com/search" method="get" accept-charset="utf-8">
    <input type="search" name="q" results="0" placeholder="搜索">
    <input type="hidden" name="q" value="site:baba.zhaoxiuyuan.com">
  </form>
</div>

  
<div class="widget tag">
  <h3 class="title">分类</h3>
  <ul class="entry">
  
    <li><a href="/categories/C/">C++</a><small>4</small></li>
  
    <li><a href="/categories/net/P2P/">P2P</a><small>2</small></li>
  
    <li><a href="/categories/WEB/">WEB</a><small>1</small></li>
  
    <li><a href="/categories/WINDOWS编程/">WINDOWS编程</a><small>6</small></li>
  
    <li><a href="/categories/bugs/">bugs</a><small>2</small></li>
  
    <li><a href="/categories/ie/flash/">flash</a><small>1</small></li>
  
    <li><a href="/categories/ie/">ie</a><small>1</small></li>
  
    <li><a href="/categories/java/">java</a><small>5</small></li>
  
    <li><a href="/categories/java/minecraft/">minecraft</a><small>2</small></li>
  
    <li><a href="/categories/net/">net</a><small>2</small></li>
  
    <li><a href="/categories/python/">python</a><small>1</small></li>
  
    <li><a href="/categories/windows/">windows</a><small>2</small></li>
  
    <li><a href="/categories/bugs/windows/">windows</a><small>1</small></li>
  
    <li><a href="/categories/工具/">工具</a><small>1</small></li>
  
    <li><a href="/categories/开源项目/">开源项目</a><small>2</small></li>
  
    <li><a href="/categories/未分类/">未分类</a><small>0</small></li>
  
    <li><a href="/categories/系统-工具/">系统/工具</a><small>7</small></li>
  
    <li><a href="/categories/软件/">软件</a><small>2</small></li>
  
  </ul>
</div>


  <div class="widget tag">
<h3 class="title">简介</h3>
<ul class="entry">
<li>本体：赵海洋</li>
<li>二次元：k1988 | 赵大海</li>
<li>现状：大蓝鲸某IT公司研发部经理</li>
<li>QQ 号：1811132352</li>
<li>早期博客：<a href="http://blog.csdn.net/k1988/">CSDN博客</a></li>
</ul>
</div>



  <iframe width="100%" height="550" class="share_self"  frameborder="0" scrolling="no" src="http://widget.weibo.com/weiboshow/index.php?language=&width=0&height=550&fansRow=2&ptype=1&speed=0&skin=1&isTitle=1&noborder=1&isWeibo=1&isFans=1&uid=1196349092&verifier=d3636f5c&dpc=1"></iframe>
</aside>
    <div class="clearfix"></div>
  </div>
  <footer id="footer" class="inner"><section>
Theme of <a href="https://github.com/k1988/lightum">Lightum</a>, Improved from <a href="https://github.com/hexojs/hexo-theme-light">Light</a>, by <a href="/">k1988</a> 
<script async src="//dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<span id="busuanzi_container_site_pv">本站总访问量<span id="busuanzi_value_site_pv"></span>次</span>
</section>
<div class="clearfix"></div>
</footer>
  <script src="//libs.baidu.com/jquery/2.0.3/jquery.min.js"></script>
<script src="/js/jquery.imagesloaded.min.js"></script>
<script src="/js/gallery.js"></script>




<link rel="stylesheet" href="/fancybox/jquery.fancybox.css" media="screen" type="text/css">
<script src="/fancybox/jquery.fancybox.pack.js"></script>
<script type="text/javascript">
(function($){
  $('.fancybox').fancybox();
})(jQuery);
</script>


<!-- mathjax config similar to math.stackexchange -->

<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    tex2jax: {
      inlineMath: [ ['$','$'], ["\\(","\\)"] ],
      processEscapes: true
    }
  });
</script>

<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
      tex2jax: {
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
      }
    });
</script>

<script type="text/x-mathjax-config">
    MathJax.Hub.Queue(function() {
        var all = MathJax.Hub.getAllJax(), i;
        for(i=0; i < all.length; i += 1) {
            all[i].SourceElement().parentNode.className += ' has-jax';
        }
    });
</script>

<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>
</body>
</html>


<a href="https://github.com/k1988" target="_blank"><img style="position: absolute; top: 0; left: 0; border: 0;" src="/imgs/forkme_left_green_007200.png" alt="Fork me on GitHub"></a>
